package com.songlanyun.common.supplychainapi.aftersale.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 售后前置校验
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BeforeCheck implements Serializable {

    /**
     * 支持售后的商品数量。
     * 但返回0时，一般是，订单还未发货，只支持退款，且仅支持全退（相当于取消订单）。遇到该情况，调用申请售后时，买了几件，数量就传几
     */
    private Integer num;
    /**
     * 支持的包装情况选项。
     * 如：包装完好、包装破损……
     * 如果此项存在，则申请售后时必须传递此项中的code，如果此项不存在，则申请售后时不用传
     */
    private PackageType[] packageType;
    /**
     * 支持的退货方式
     * 如：上门取件、第三方物流配送……
     * [{
     * "code": "4",
     * "name": "上门取件"
     * },{
     * "code": "7",
     * "name": "客户送货"
     * },{
     * "code": "40",
     * "name": "客户发货"
     * }]
     */
    private PickType[] pickType;
    /**
     * 售后原因的可选项；若此项存在，则调用售后接口时，必须传递此项中id值；若此项不存在，则调用售后接口时，不必传递。
     * 关于是否必须上传售后凭证的问题说明，若此项存在，以此项中needVoucher为准；若此项不存在，则上传凭证是自愿上传的。
     * 关于是否支持退运费的说明，若此项存在，以此项中的noRefundCarriage为准；若此项不存在，一般不支持退运费
     */
    private ReasonsType[] reasonsType;
    /**
     * 支持的反件方式。维修、换货必传。以换货为例：此字段是指要求供货商以哪种方式将更换后的货物再次发送给您
     */
    private ReturnType[] returnType;
    /**
     * 支持的售后类型
     * 如：退货、换货、维修、退款……
     * {
     * code: "10",
     * name: "退货"
     * },
     * {
     * code: "20",
     * name: "换货"
     * },
     * {
     * code: "30",
     * name: "维修"
     * },
     * {
     * code: "40",
     * name: "仅退款"
     * },
     * {
     * code: "50",
     * name: "退货退款"
     * }
     */
    private ServiceType[] serviceType;

    @Data
    public static class PackageType {
        /**
         * 唯一编码
         */
        private String code;
        /**
         * 中文说明
         */
        private String name;

    }

    @Data
    public static class PickType {
        /**
         * 唯一编码
         */
        private String code;
        /**
         * 中文说明
         */
        private String name;

    }

    @Data
    public static class ReasonsType {
        /**
         * 原因code
         */
        private String code;
        /**
         * 原因中文说明
         */
        private String name;
        /**
         * 是否必须上传售后凭证（图片）
         */
        private boolean needVoucher;
        /**
         * 是否支持退运费
         */
        private boolean refundCarriage;
        /**
         * 提示说明，一般都是 empty string
         */
        private String tip;

    }

    @Data
    public static class ReturnType {
        /**
         * 唯一编码
         */
        private String code;
        /**
         * 中文说明
         */
        private String name;
    }

    @Data
    public static class ServiceType {
        /**
         * 唯一编码
         */
        private String code;
        /**
         * 中文说明，此处需要注意，name一样，不代表code一样，name仅用于展示用途，当下一步调用售后接口的时候需要传递的是code，而非name
         */
        private String name;
    }
}
